package cn.jw.starter.common.utils;

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;

import cn.hutool.core.date.LocalDateTimeUtil;

/**
 * <p>
 * 常用的日期工具类
 * </p>
 *
 * @author 王广帅
 * @since 2024/4/7 18:43
 **/
public class JwDateUtil {

    private static ZoneId DEFAULT_ZONE_ID = ZoneId.systemDefault();
    private static final String STANDARD_DATE_STR = "yyyy-MM-dd HH:mm:ss";
    private static final String YYYY_MM_DD_HH_MM_SS = "yyyyMMddHHmmss";

    /**
     * 时间区id，默认是取的系统默认的，这个方法可以修改系统默认的时区id
     * 
     * @param zoneId
     */
    public static void setZoneId(ZoneId zoneId) {
        DEFAULT_ZONE_ID = zoneId;
    }

    /**
     * 一天时间的毫秒数
     */
    public static final Long ONE_DAY_MILLS = 24 * 60 * 60 * 1000L;

    /**
     * 标准格式日期字符串转毫秒时间戳，格式：yyyy-MM-dd HH:mm:ss
     * 
     * @param dateStr
     * @return
     */
    public static long strToMill(String dateStr) {
        LocalDateTime localDateTime = LocalDateTime.parse(dateStr, DateTimeFormatter.ofPattern(STANDARD_DATE_STR));
        return localDateTimeToMill(localDateTime);
    }

    /**
     * 时间转化为毫秒数
     * 
     * @param localDateTime
     * @return
     */
    public static long localDateTimeToMill(LocalDateTime localDateTime) {
        return localDateTime.atZone(DEFAULT_ZONE_ID).toInstant().toEpochMilli();
    }

    /**
     * 毫秒数转时间类
     * 
     * @param mill
     * @return
     */
    public static LocalDateTime millToLocalDateTime(long mill) {
        return LocalDateTimeUtil.of(mill, DEFAULT_ZONE_ID);
    }

    /**
     * 毫秒时间戳转标准的日期格式: yyyy-MM-dd HH:mm:ss
     * 
     * @param mill
     * @return
     */
    public static String getStandardDateStr(long mill) {
        LocalDateTime localDateTime = millToLocalDateTime(mill);
        return LocalDateTimeUtil.format(localDateTime, DateTimeFormatter.ofPattern(STANDARD_DATE_STR));
    }

    /**
     * 获取当前日期，格式：yyyyMMddHHmmss
     * 
     * @return
     */
    public static String getYyyyMMddHHMmSs() {
        LocalDateTime localDateTime = LocalDateTime.now();
        return LocalDateTimeUtil.format(localDateTime, DateTimeFormatter.ofPattern(YYYY_MM_DD_HH_MM_SS));
    }

    /**
     * 获取当前毫秒时间戳
     * 
     * @return
     */
    public static long getCurrentTime() {
        return System.currentTimeMillis();
    }
}
